﻿CREATE PROCEDURE [dbo].[InventoryLinesTrancDelete]
( --удаляет корректирующею проводку по строке инвентаризационной описи
	@Original_Id int,     --CD.InventoryLines.Id
	@Original_MD datetime --CD.InventoryLines.MD
)
AS
DECLARE @orgDocId int, @orgDocDate smalldatetime, @orgDocTypeId int
DECLARE @orgPartyId int, @orgPartyDocId int
DECLARE @orgInputLineId int, @orgInputLineDocId int, @orgQntty int
DECLARE @intInputCount int, @intOutputCount int, @intT int
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intRowCount int

	SET NOCOUNT ON

IF (@Original_Id Is Null) OR (@Original_MD Is Null) 
BEGIN
	SELECT @intErrCode = 80, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgDocId = DocId, @orgPartyId = PartyId, @orgPartyDocId = PartyDocId,
@orgInputLineId = InputLineId, @orgInputLineDocId = InputLineDocId,
@orgQntty = FactQntty - DocQntty
FROM dbo.vwInventoryLines 
WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 81, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SELECT @orgDocTypeId = DocTypeId, @orgDocDate = DocDate FROM CA.Documents WHERE Id = @orgDocId

IF (@orgDocTypeId <> 6)
BEGIN
	SELECT @intErrCode = 82, @strMsg = 'Неправильный тип документа!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF @orgQntty <> 0 
BEGIN
--select 'AAA' As TheLabel, @orgPartyId, @intT, @orgDocDate
--нелулевое количество - проверить товародвижение
	SET @intT = 0 - @orgQntty
	EXEC @intRet = dbo.CheckPartyFlow @orgPartyId, @intT, @orgDocDate, @intInputCount OUTPUT, @intOutputCount OUTPUT

	IF (@intRet <> 0) RETURN @intRet
	
	IF @orgPartyDocId = @orgDocId AND ( (@intInputCount + @intOutputCount ) <> 1)
	BEGIN --партия создана по документу инвентаризации и по этой партии было товародвижение
		SELECT @intErrCode = 83, 
		@strMsg = 'По партии с идентификатором ' + cast(@orgPartyId as varchar(20)) + ' было товародвижение!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

--удаляем строку товародвижения
	UPDATE CD.InventoryLines SET GoodsDocLineId = NULL WHERE Id = @Original_Id 
	DELETE FROM [CA].[GoodsDocLines] WHERE DocId = @orgDocId AND PartyId = @orgPartyId

	SELECT @intErrCode = @@error, @intRowCount = @@rowcount
	IF @intErrCode <> 0 RETURN @intErrCode

	IF (@intRowCount <> 1)
	BEGIN
		SELECT @intErrCode = 84, 
		@strMsg = 'Запись из таблицы товародвижения не удалена!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

	IF @orgPartyDocId = @orgDocId --партия создана по документу инвентаризации
	BEGIN --удаляем партию
		UPDATE CD.InventoryLines SET [PartyId] = NULL WHERE Id = @Original_Id 
		DELETE FROM CD.Parties WHERE DocId = @orgDocId AND Id = @orgPartyId

		SELECT @intErrCode = @@error, @intRowCount = @@rowcount
		IF @intErrCode <> 0 RETURN @intErrCode

		IF (@intRowCount <> 1)
		BEGIN
			SELECT @intErrCode = 85, 
			@strMsg = 'Запись из таблицы партий не удалена!'
			RAISERROR (@strMsg, 11, 1)
			RETURN @intErrCode
		END
	
		IF @orgInputLineDocId = @orgDocId --приходная строка создана по документу инвентаризации
		BEGIN --удаляем приходную строку
			DELETE FROM CD.InputLines WHERE DocId = @orgDocId AND Id = @orgInputLineId

			SELECT @intErrCode = @@error, @intRowCount = @@rowcount
			IF @intErrCode <> 0 RETURN @intErrCode

			IF (@intRowCount <> 1)
			BEGIN
				SELECT @intErrCode = 86, 
				@strMsg = 'Запись из таблицы приходов не удалена!'
				RAISERROR (@strMsg, 11, 1)
				RETURN @intErrCode
			END
			
		END--OF IF @orgInputLineDocId = @orgDocId

	END--OF IF @orgPartyDocId = @orgDocId 

END--OF IF @orgQntty <> 0 

RETURN 0




